import fs from 'fs/promises'
import path from 'path';
/**
 * 提取代码中 $t 和 t 函数的参数
 * @param {string} code - 包含 $t/t 函数的代码字符串
 * @returns {Object} 包含 $t 和 t 函数参数的对象
 */
function extractI18nKeys(code) {
  // 正则表达式：匹配 $t('xxx') 或 t("xxx") 等格式，支持单引号/双引号，忽略括号内的空格
  const regex = /\b(\$?t)\(['"\s]*([^'"]+?)['"\s]*\)/g;
  const result = {
    $t: [], // 存储 $t 函数的参数
    t: []   // 存储 t 函数的参数
  };
  let match;

  // 循环匹配所有符合条件的函数调用
  while ((match = regex.exec(code)) !== null) {
    const funcName = match[1]; // 函数名：$t 或 t
    const key = match[2];      // 提取的参数（如 'bcrz'）

    // 根据函数名存入对应数组，避免重复
    if (!result[funcName].includes(key)) {
      result[funcName].push(key);
    }
  }

  return result;
}

/**
 * 得到所有的vue文件
 */
async function getVueFiles(dirPath,vueFiles=[]) {
  try {
    const files = await fs.readdir(dirPath);
    // 递归读取子目录
    for (const file of files) {
      let filedir = path.join(dirPath, file);
      const stats = await fs.stat(path.join(dirPath, file));
      if (stats.isDirectory()) {
       await getVueFiles(filedir,vueFiles);
      }
      if(stats.isFile() && file.endsWith('.vue')){
        vueFiles.push(filedir);
      }
    }
  } catch (err) {
    console.error('读取目录失败:', err);
    return [];
  }
}
let vueFiles = [];
await getVueFiles('F:/lq/sz/game-center-ts/src',vueFiles);

// 遍历所有vue文件，提取i18n键
const i18nKeys = new Set();
for (const file of vueFiles) {
  let code =await fs.readFile(file, 'utf8');
  let keys = extractI18nKeys(code);
  keys.$t.forEach( key => {
    i18nKeys.add(key)
  });
  keys.t.forEach( key => {
     i18nKeys.add(key)
  });
}
// 打印所有i18n键和对应的vue文件
//多余的key
const extraKeys = new Set();
const needKeys = new Set()
const sourceFile = 'F:/lq/sz/game-center-ts/src/common/locale/lang/zh.json';
let sourceCode = await fs.readFile(sourceFile, 'utf8');
let sourceKeys = JSON.parse(sourceCode);
for(let key of Object.keys(sourceKeys)){
  if(!i18nKeys.has(key)){
    extraKeys.add(key);
  }else{
    needKeys.add(key)
  }
}
const obj = {}
needKeys.forEach((val,key)=>{
  console.log(val,key)
  obj[val] = sourceKeys[val]
})
await fs.writeFile(sourceFile, JSON.stringify(obj, null, 2));





// console.log(vueFiles);